
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import { __extends } from 'tslib';
import axisDefault from './axisDefault.js';
import { getLayoutParams, mergeLayoutParam, fetchLayoutMode } from '../util/layout.js';
import OrdinalMeta from '../data/OrdinalMeta.js';
import { AXIS_TYPES } from './axisCommonTypes.js';
import { each, merge } from 'zrender/lib/core/util.js';
/**
 * Generate sub axis model class
 * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ...
 */

export default function axisModelCreator(registers, axisName, BaseAxisModelClass, extraDefaultOption) {
	each(AXIS_TYPES, function (v, axisType) {
		var defaultOption = merge(merge({}, axisDefault[axisType], true), extraDefaultOption, true);

		var AxisModel =
    /** @class */
    function (_super) {
    	__extends(AxisModel, _super);

    	function AxisModel() {
    		var _this = _super !== null && _super.apply(this, arguments) || this;

    		_this.type = axisName + 'Axis.' + axisType;
    		return _this;
    	}

    	AxisModel.prototype.mergeDefaultAndTheme = function (option, ecModel) {
    		var layoutMode = fetchLayoutMode(this);
    		var inputPositionParams = layoutMode ? getLayoutParams(option) : {};
    		var themeModel = ecModel.getTheme();
    		merge(option, themeModel.get(axisType + 'Axis'));
    		merge(option, this.getDefaultOption());
    		option.type = getAxisType(option);

    		if (layoutMode) {
    			mergeLayoutParam(option, inputPositionParams, layoutMode);
    		}
    	};

    	AxisModel.prototype.optionUpdated = function () {
    		var thisOption = this.option;

    		if (thisOption.type === 'category') {
    			this.__ordinalMeta = OrdinalMeta.createByAxisModel(this);
    		}
    	};
    	/**
       * Should not be called before all of 'getInitailData' finished.
       * Because categories are collected during initializing data.
       */

    	AxisModel.prototype.getCategories = function (rawData) {
    		var option = this.option; // FIXME
    		// warning if called before all of 'getInitailData' finished.

    		if (option.type === 'category') {
    			if (rawData) {
    				return option.data;
    			}

    			return this.__ordinalMeta.categories;
    		}
    	};

    	AxisModel.prototype.getOrdinalMeta = function () {
    		return this.__ordinalMeta;
    	};

    	AxisModel.type = axisName + 'Axis.' + axisType;
    	AxisModel.defaultOption = defaultOption;
    	return AxisModel;
    }(BaseAxisModelClass);

		registers.registerComponentModel(AxisModel);
	});
	registers.registerSubTypeDefaulter(axisName + 'Axis', getAxisType);
}

function getAxisType(option) {
	// Default axis with data is category axis
	return option.type || (option.data ? 'category' : 'value');
}